/******************************************************************************
* Copyright (c) 2007 by System Helmholz GmbH.
*
* This software is copyrighted by and is the sole property of Systeme
* Helmholz GmbH. All rights, title, ownership, or other interests in the
* software remain the property of Systeme Helmholz GmbH. This software
* may only be used in accordance with the corresponding license agreement.
* Any unauthorized use, duplication, transmission, distribution, or
* disclosure of this software is expressly forbidden.
*
* This Copyright notice may not be removed or modified without prior
* written consent of Systeme Helmholz GmbH.
*
* Systeme Helmholz GmbH, reserves the right to modify this software
* without notice.
*
* Systeme Helmholz GmbH Phone: +49 9135 7380 0
* Gewerbegebiet Ost 36 Fax: +49 9135 7380 50
* 91085 Weisendorf Web: http://www.helmholz.de
* Germany Email: info@helmholz.de
*
******************************************************************************
*
* Projekt : NETLink PRO/USB for NetARM processor
* Copyright: Systeme Helmholz GmbH
* Author : Ehser
* Version : 1.3 / 09.10.07
* File : netlink-js.htm
*
*
* Javascript tool zum SteuernVariablen mit NETlink PRO
*/
var GERMAN = 0;
var ENGLISH = 1;
var language = GERMAN;
var DOMAIN_TIMER = 14;
var CYCLIC_INTERVAL = 500;
//
// errors from NETLink
//
var TARGET_BUFFER_TOO_SMALL = 1;
var NETLINK_NOT_ONLINE_NO_RFC_MODE = 1001;
var NETLINK_NOT_ONLINE = 1002;
var NO_VALID_MPI = 1003;
var OWN_MPI_NOT_ALLOWED = 1004;
var MISSING_NETLINK_ELEMENT = 1008;
var ERR_XON_NOT_ACCEPTED = 1010;
var ERR_XML_BUFFER_TOO_SMALL = 1011;
var ERR_RESULT_BUFFER_TOO_SMALL = 1012;
var ERR_TOO_MUCH_VARS_IN_RESPONSE = 1013;
var ERR_WEBORDER_FAILED = 1014;
var ERR_COULD_NOT_SAVE_CONFIG = 1015;
//
// global NETLink states
//
var NETLINK_NOT_AVAILABLE = 0;
var NETLINK_READY = 1;
var NETLINK_BOOT = 2;
var NETLINK_APP_START = 3;
var NETLINK_SAVE_WLAN_CONF = 4;
var NETLINK_WRITE_NVRAM = 5;
var SAVE_WLAN_PARAMETER_OK = 6
var SAVE_WLAN_PARAMETER_FAILED = 7
var FORMAT_DEC = "dec";
var FORMAT_HEX = "hex";
var FORMAT_BIN = "bin";
var isIE = true;
var table_caption_color = "#b0e0b0";
var g_ajax = null;
var g_configuredMPI = "255";
var g_xmlConfig = ""; // DOM object of NETLink configuration
var g_xmlReadOrder = "";
var cyclicActive = null;
var toggle = false;
var bWaitForResponse = false;
var MAX_NO_OF_VARS = 10;
var g_NoOfVariables = 0; // number of current variables configured
var cnt_html_s7_variable_lines = 0; // number of current lines received
var ID_DOMAIN = "id_domain_";
var ID_INDEX = "id_index_";
var ID_FORMAT = "id_format_";
var ID_VALUE = "id_value_";
var ID_DESCRIPTION = "id_descr_";
var arS7Types = new Array("output","output","output",
"input","input","input",
"flag","flag","flag",
"data","data","data",
"counter","timer");
var arS7Width = new Array("byte","word","dword",
"byte","word","dword",
"byte","word","dword",
"byte","word","dword",
"counter","timer");
var arVariableFormatInfo = new Array(MAX_NO_OF_VARS);
var MAX_ENTRIES = 100;
var trace_index = 0;
var traceBuffer = new Array(MAX_ENTRIES+1);
/**
* createVariableLines(index)
*
* description: erzeugt dynamisch eine Tabellenzeile für eine S7 Variable
* param: index: Zeilennummer um eindeutige IDs für die veränderbaren Elemente der Zeile zu erzeugen
*
*/
function createVariableLines(index)
{
var html;
var str;
html = '
\n\n';
html += '
' + index + '
\n\n';
html += '
\n';
html += ' \n\n';
html += '
\n\n';
html += '
\n\n';
html += '
0
\n\n';
html += '
\n';
html += ' \n\n';
html += '
\n\n';
html += '
\n\n';
html += '
\n';
document.writeln(html);
cnt_html_s7_variable_lines++; // count number of S7-Variable lines
} // END createVariableLines(()
/**
Starten zyklisches 'Holen Variablen'
*/
function btnGetVariables(mode)
{
if (mode == "SAVE_CONFIG")
{
doWait();
sendCurrentConfiguration(true); // save configuration in NVRAM (takes some time)
doNoWait();
return;
}
if (mode == "ONE_TIME")
{
if (bWaitForResponse == true)
{
return; // do nothing last read is still not back
}
stopCyclicRead();
sendCurrentConfiguration(false);
makeReadOrder();
CyclicGetVariables();
return;
}
if (mode == "CYCLIC")
{
if (cyclicActive != null)
{
stopCyclicRead();
return;
}
sendCurrentConfiguration(false);
makeReadOrder();
//
// Button "holen" zu Button "anhalten" ändern + Farbe ändern
//
cyclicActive = window.setInterval("CyclicGetVariables()", CYCLIC_INTERVAL);
setButton("Stop");
}
}
function CyclicGetVariables()
{
var xmlVariables;
if (bWaitForResponse == true)
{
return; // do nothing last read is still not back
}
bWaitForResponse = true;
askNETLink(g_xmlReadOrder, true);
// askNETLink("/netlink/release/NetlinkRead.xml", true);
}
function setButton(buttonText)
{
buttonElement = document.getElementById("button_id");
if (buttonElement != null)
{
buttonElement.value = buttonText;
if (cyclicActive == null)
{
buttonElement.style.backgroundColor = "";
}
else
{
// buttonElement.style.backgroundColor = "#A0FFA0";
}
}
}
/**
*/
function sendCurrentConfiguration(bSave)
{
var putConfigXML;
var i;
var html_id;
var domain_value;
var index_value;
var format_value;
var currentMpi;
var currentSlot;
var currentNoVars;
var now = new Date();
var Tag = now.getDate();
var Monat = now.getMonth() + 1;
var Jahr = now.getYear();
var Stunden = now.getHours();
var Minuten = now.getMinutes();
var Sekunden = now.getSeconds();
// auf 2-stellige Jahreszahl reduzieren
if (isIE == true) {
Jahr -= 2000; // internet explorer
}
else {
Jahr -= 100; // firefox
}
Jahr = "0" + Jahr;
Jahr = Jahr.substr(Jahr.length - 2,2);
Monat = "0" + Monat;
Monat = Monat.substr(Monat.length - 2);
Tag = "0" + Tag;
Tag = Tag.substr(Tag.length - 2);
Stunden = "0" + Stunden;
Stunden = Stunden.substr(Stunden.length - 2);
Minuten = "0" + Minuten;
Minuten = Minuten.substr(Minuten.length - 2);
var date_time = "" + Jahr + Monat + Tag + Stunden + Minuten;
currentMpi = getCurrentMpi();
currentSlot = getCurrentSlot();
currentNoVars = getNoOfVariables();
putConfigXML = "xmlRequest=\n";
putConfigXML += "\t " + html_id + " not found!" );
}
html_id = ID_INDEX + i;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
index_value = htmlElement.value;
}
else
{
alert("sendCurrentConfiguration(): html-element -> " + html_id + " not found!" );
}
html_id = ID_FORMAT + i;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
format_value = htmlElement.selectedIndex;
}
else
{
alert("sendCurrentConfiguration(): html-element -> " + html_id + " not found!" );
}
html_id = ID_DESCRIPTION + i;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
descr_value = encodeURI(htmlElement.value); // encodeURI() wg. Umlaute
}
else
{
alert("sendCurrentConfiguration(): html-element -> " + html_id + " not found!" );
}
putConfigXML += "\t\t\n";
putConfigXML += "\t\t\tdescr_value %3D \"" + descr_value + "\">\n";
putConfigXML += "\t\t\n";
}
catch (errorInfo)
{
alert("sendCurrentConfiguration()->Exeption on line: " + i + "\nerrorInfo = " + errorInfo);
break; // END loop
}
} // END for (i=0 ....
putConfigXML += "\t\n";
putConfigXML += "\n";
askNETLink(putConfigXML, false); // send syncron! (asyncron = false)
g_configuredMPI = currentMpi;
}
/**
*/
function makeReadOrder()
{
var i;
var html_id;
var var_tag;
var domain_value;
var index_value;
var format_value;
var currentMpi;
currentMpi = getCurrentMpi();
currentSlot = getCurrentSlot();
g_xmlReadOrder = "xmlRequest=\n";
g_xmlReadOrder += "\t\n";
for (i=1;i " + html_id + " not found!" );
return;
}
html_id = ID_INDEX + i;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
index_value = htmlElement.value;
}
else
{
alert("makeReadOrder(): html-element -> " + html_id + " not found!" );
}
html_id = ID_FORMAT + i;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
format_value = htmlElement.selectedIndex;
}
else
{
alert("makeReadOrder(): html-element -> " + html_id + " not found!" );
}
g_xmlReadOrder += "\t\t<" + var_tag + "\n";
g_xmlReadOrder += "\t\t\thtml_id %3D \"" + i + "\"\n";
g_xmlReadOrder += "\t\t\ttype %3D \"" + var_type + "\"\n";
g_xmlReadOrder += "\t\t\tindex %3D \"" + index_value + "\"\n";
g_xmlReadOrder += "\t\t\tcount %3D \"1\"\n";
g_xmlReadOrder += "\t\t" + var_tag + ">\n";
}
catch (errorInfo)
{
alert("makeReadOrder()->Exeption on line: " + i + "\nerrorInfo = " + errorInfo);
break; // END loop
}
} // END for (i=0 ....
g_xmlReadOrder += "\t\n";
g_xmlReadOrder += "\n";
}
/**
*/
function showS7Variables(xmlVariables)
{
var NetlinkChild;
var i;
bReturn = checkResponse("showS7Variables", xmlVariables);
if (bReturn == true)
{
NetlinkChild = getElement(xmlVariables, "NETLink");
readNode = getElement(NetlinkChild, "read");
if (readNode.length > 0)
{ // look for Read-Child
readVariables(readNode);
}
}
else
{
stopCyclicRead();
}
}
/**
*/
function readVariables(ReadNode)
{
var VariableNodes;
var NodeName;
var var_id;
var var_value;
var var_formula;
var var_type;
var multiplikator;
var timer_value;
var minutes;
var seconds;
var milli_seconds;
var htmlElement;
var cnt_variables;
var i;
//
// get variables values from received XML information
//
//debugger;
VariableNodes = getChildElements(ReadNode, "*");
cnt_variables = VariableNodes.length;
for (i=0;i 2)
{
var_formula = var_formula.replace(/x/i, var_value);
var_value = eval(var_formula);
}
switch(NodeName)
{
case "counter":
var_value = var_value/16; // counter values are decimal!!
var_value = Math.round(var_value);
break;
case "timer":
multiplikator = var_value & 0x3000;
multiplikator >>= 12;
timer_value = var_value & 0x0FFF;
timer_value = (((timer_value & 0x0F00)>>8) * 100) + (((timer_value & 0x00F0)>>4) * 10) + (timer_value & 0x000F); // counter values are decimal!!
timer_value = Math.round(timer_value);
switch(multiplikator)
{
case 0: // 0,01 sec
minutes = -1;
seconds = Math.round(timer_value/100);
milli_seconds = (timer_value % 100) * 10;
break;
case 1: // 0,1 sec
minutes = -1;
seconds = Math.round((timer_value-5)/10);
if (seconds > 60) {
minutes = Math.round((seconds-30)/60);
seconds = (seconds % 60);
}
milli_seconds = (timer_value % 10) * 100;
break;
case 2: // 1 sec
minutes = Math.round(timer_value/60);;
seconds = timer_value % 60;
milli_seconds = -1;
break;
case 3: // 10 sec
minutes = Math.round((timer_value*10)/60);;
seconds = (timer_value*10) % 60;
milli_seconds = -1;
break;
default:;
}
break;
}
//
// change html page according to the configuration values
// read current format info from the html page
//
var_id = ID_FORMAT + var_no;
htmlElement = document.getElementById(var_id);
var_format = htmlElement.selectedIndex;
var_format = htmlElement.options[htmlElement.selectedIndex].text;
var_value_disp = getFormatedValue(var_value,var_format,var_no-1);
if (NodeName == "timer") {
// Timer has unique display format
var_value_disp = "";
if (minutes > 0){
var_value_disp = minutes.toString(10) + "m";
}
var_value_disp += seconds.toString(10) + "s";
if (milli_seconds >= 0){
var_value_disp += milli_seconds.toString(10) + "ms";
}
}
var_id = ID_VALUE + var_no;
htmlElement = document.getElementById(var_id);
htmlElement.firstChild.nodeValue = var_value_disp;
}
catch (errorInfo)
{
alert("readVariables() -> Exeption on line: " + i + "\nerrorInfo = " + errorInfo);
break; // END loop
}
} // END for (i=0 ....
}
/**
*/
function updateFormat(line_no)
{
var var_id;
var var_value;
var var_value_text;
var var_value_disp;
var var_type;
var html_id;
var htmlElement;
try
{
// get current value from HTML page
html_id = ID_VALUE + line_no;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
var_value_text = htmlElement.firstChild.nodeValue;
}
else
{
alert("adjustToFormat(): html-element -> " + html_id + " not found!" );
return;
}
switch(arVariableFormatInfo[line_no-1])
{
case FORMAT_HEX: // line_no is base 1 !!!!
// current value is in hex
var_value = parseInt(var_value_text,16);
break;
case FORMAT_DEC: // current value is decimal
var_value = parseInt(var_value_text,10);
break;
case FORMAT_BIN: // current value is binary
var reg_exp = / /g;
var_value_text = var_value_text.replace(reg_exp,""); // remove spaces from binary value
var_value = parseInt(var_value_text,2);
break;
}
//
// change html page according to the new format
//
var_id = ID_FORMAT + line_no;
htmlElement = document.getElementById(var_id);
var_format = htmlElement.selectedIndex;
var_format = htmlElement.options[htmlElement.selectedIndex].text; // get the new format
var_value_disp = getFormatedValue(var_value,var_format,line_no-1);
var_id = ID_VALUE + line_no;
htmlElement = document.getElementById(var_id);
htmlElement.firstChild.nodeValue = var_value_disp;
}
catch (errorInfo)
{
alert("adjustToFormat() -> Exeption error = " + errorInfo);
}
}
/**
*/
function getFormatedValue(var_value, var_format, line)
{
var id_index;
var html_id;
var domain_value;
var var_type;
var no_of_digits;
var binValue;
var len;
var cnt;
var start;
var formated_value = ""; // default is empty status
if (!isNaN(var_value)) // check if it is a Number
{
//
// format the value as desired
//
id_index = line + 1; // base 1
html_id = ID_DOMAIN + id_index;
htmlElement = document.getElementById(html_id);
if (htmlElement != null)
{
domain_value = htmlElement.selectedIndex;
var_type = arS7Width[domain_value-1]; // -1 = base 0
}
switch(var_type)
{
case "byte":
no_of_digits = 8;
break;
case "word":
no_of_digits = 16;
break;
case "dword":
no_of_digits = 32;
break;
default:
no_of_digits = 16;
}
switch(var_format)
{
case FORMAT_HEX:
formated_value = var_value.toString(16).toUpperCase();
formated_value = "00000000" + formated_value;
formated_value = formated_value.substr(formated_value.length - (no_of_digits>>2));
formated_value = "0x" + formated_value;
arVariableFormatInfo[line] = FORMAT_HEX;
break;
case FORMAT_BIN:
binValue = var_value.toString(2);
binValue = "00000000000000000000000000000000" + binValue;
binValue = binValue.substr(binValue.length - no_of_digits);
len = binValue.length;
cnt = len/8;
start = len % 8;
formated_value += binValue.substr(0,start) + " ";
for (i=0; i\"n";
getConfigXML += "\n";
// g_xmlConfig = askNETLink("/netlink/release/NetlinkConfig.xml"); // PC - Test Version
g_xmlConfig = askNETLink(getConfigXML, false); // NETLink Version, send syncron! (asyncron = false)
bWaitForResponse = false; // transfer ready
NetlinkConfig = getElement(g_xmlConfig, "config");
if (NetlinkConfig.length > 0)
{ // configuration for "config" found
//
// get number of variables from received XML configuration
//
g_NoOfVariables = getAttribute(NetlinkConfig, "no_of_vars");
}
} // END loadConfig()
/**
*/
function getNetlinkState(cbFunction, command)
{
var NetlinkState;
var getStateXML;
var xmlState;
setNetlinkStateFunction(cbFunction);
getStateXML = "xmlRequest=\n";
getStateXML += "\n";
// ------------- TEST ------------------------------------
// xmlState = askNETLink("/netlink/wlan/NetlinkState.xml", false); // PC - Test Version , send syncron! (asyncron = false)
// NETLinkCallBackHandler(xmlState);
// ------------- TEST ------------------------------------
// xmlState = askNETLink("/netlink/release_en/NetlinkConfig.xml", false); // PC - Test Version , send syncron! (asyncron = false)
xmlState = askNETLink(getStateXML, true); // NETLink State, send syncron! (asyncron = false)
bWaitForResponse = false; // transfer ready
} // END getNetlinkState()
/**
*/
function initVariableLines()
{
var ip;
var NetlinkChild;
var lasNode;
var configNode;
var slot;
var i;
NetlinkChild = getElement(g_xmlConfig, "NETLink");
if (NetlinkChild.length > 0)
{ //
lasNode = getElement(NetlinkChild, "las");
configureMPI(lasNode);
configNode = getElement(NetlinkChild, "config");
if (configNode.length > 0)
{ // configuration for "config" found
//
// get mpi address from received XML configuration
//
mpi = getAttribute(configNode, "mpi_address");
selectOption("idMPIAddress", mpi)
//
// get slot from received XML configuration
//
slot = getAttribute(configNode, "slot");
setSlotValue(slot);
configureNoOfVar();
configureS7Variables(configNode);
}
}
} // END initVariableLines()
/**
*/
function checkResponse(instance_name, xmlResponse)
{
var NetlinkChild;
var error_no;
var error_text;
var iReturn = false;
if (xmlResponse.length == 0)
{
return true;
}
NetlinkChild = getElement(xmlResponse, "NETLink");
if (NetlinkChild.length == 0)
{
alert("checkResponse(): " + instance_name + "-> missing root node 'NETLink')");
return iReturn;
}
NetlinkResponse = getElement(NetlinkChild, "response");
if (NetlinkResponse.length == 0)
{
alert("checkResponse(): " + instance_name + "-> no response element)");
return iReturn;
}
error_no = getAttribute(NetlinkResponse,"error_no");
var nbr = parseInt(error_no, 10);
if (nbr == 0)
{
iReturn = true;
}
else
{
stopCyclicRead();
switch(nbr)
{
case TARGET_BUFFER_TOO_SMALL:
alert("\nTarget buffer for creating S7 AnyPointers is too small. Use less variables.\n");
iReturn = false;
break;
case NETLINK_NOT_ONLINE_NO_RFC_MODE:
alert("NETLink is not ONLINE!\n\nConfigure 'Go online after bootup'!");
iReturn = true;
break;
case NETLINK_NOT_ONLINE:
alert("NETLink is not ONLINE!\n\nNo other active partner can be found.");
iReturn = true;
break;
case NO_VALID_MPI:
alert("\nThe selected MPI address is not valid.\n");
iReturn = false;
break;
case OWN_MPI_NOT_ALLOWED:
alert("\nThe own MPI address cannot be used.\n");
iReturn = false;
break;
case MISSING_NETLINK_ELEMENT:
alert("\nMissing XML-Element ''!\n");
iReturn = false;
break;
case ERR_XON_NOT_ACCEPTED:
alert("\nNo successful XON (activating MPI connection). Maybe SAP of CPU not activated!\n");
iReturn = false;
break;
case ERR_XML_BUFFER_TOO_SMALL:
alert("\nXML output buffer for response is too small. Use less variables. \n");
iReturn = false;
break;
case ERR_RESULT_BUFFER_TOO_SMALL:
alert("\nResult buffer for Profibus response is too small.\n");
iReturn = false;
break;
case ERR_TOO_MUCH_VARS_IN_RESPONSE:
alert("\nNumber of variables in CPU response are greater then the number of expected variables!\n");
iReturn = false;
break;
case ERR_WEBORDER_FAILED:
alert("\nOrder could not be processed. (PLC communication failed!)\n");
iReturn = false;
break;
case ERR_COULD_NOT_SAVE_CONFIG:
alert("\nCould not save configuration.\n");
iReturn = false;
break;
default:
alert("checkResponse(): " + instance_name + "-> xmlResponse with error number: " + error_no);
}
}
return iReturn;
}
/**
*/
function configureMPI(lasNode)
{
var value;
var lasNode;
var lasMPIs;
var currSelected = 0;
var mpiElement;
var newText;
//
// address mpi-DOM-Element on html-page
//
mpiElement = document.getElementById("idMPIAddress");
optionElement = document.createElement("option");
mpiElement.appendChild(optionElement); // add empty option element as default
//
// get MPI info from received XML configuration
//
lasMPIs = getChildElements(lasNode, "mpi");
for (i=0;i g_NoOfVariables)
{
alert("Es wurden mehr Zeilen in der XML-Konfiguration definiert als angezeigt werden sollen!\n konfiguriert: " + cnt_configered_lines + "\n angezeigt: " + g_NoOfVariables);
cnt_configered_lines = g_NoOfVariables;
}
for (i=0;i= "0") {
mpiOption = MPIElement.options[MPIElement.value].text;
}
else {
mpiOption = "255";
}
return mpiOption;
}
function getCurrentSlot()
{
var current_slot;
var htmlElement;
htmlElement = document.getElementById("idSlot");
current_slot = htmlElement.value;
return current_slot;
}
function setSlotValue(slot)
{
var htmlElement;
htmlElement = document.getElementById("idSlot");
htmlElement.value = slot;
return;
}
/**
*/
function getNoOfVariables()
{
var VariableElement;
var varOption;
var index;
VariableElement = document.getElementById("idNoOfVar");
if (VariableElement.value > "0") {
index = VariableElement.value - 1;
varOption = VariableElement.options[index].text;
}
else {
varOption = "255";
}
return varOption;
}
/**
*/
function selectOption(ElementId, optionToSelect)
{
var htmlElement;
var text;
var value;
var mask = "00";
var nNewOption;
var nHtmlOption;
optionToSelect = mask + optionToSelect;
optionToSelect = optionToSelect.substr(1);
htmlElement = document.getElementById(ElementId);
if (htmlElement == null)
{
alert("selectOption(): ElementId = " + ElementId + " not found!");
return;
}
for (i = 0; i < htmlElement.length; ++i)
{
if (parseInt(htmlElement.options[i].text,10) == parseInt(optionToSelect,10))
{
htmlElement.selectedIndex = i;
}
}
}
/**
*/
function lineChanged(line_no, column)
{
var wert;
var variable;
var LineElement;
variable = column + line_no;
LineElement = document.getElementById(variable);
if (column == ID_DOMAIN)
{
var_domain = LineElement.selectedIndex;
format_id = ID_FORMAT + line_no;
if (var_domain == DOMAIN_TIMER) // is timer ?
{
document.getElementById(format_id).disabled = true;
}
else
{
document.getElementById(format_id).disabled = false;
}
}
if (column == ID_FORMAT)
{
updateFormat(line_no);
return;
}
//alert("line " + line_no + " changed to " + wert);
//LineElement.selectedIndex = 7;
stopCyclicRead();
}
/**
*/
function MPIChanged()
{
var MPIElement = document.getElementById("idMPIAddress");
//alert("MPI changed! selected MPI address index = " + MPIElement.value + " selected MPI address value = " + MPIElement.options[MPIElement.value].text);
stopCyclicRead();
}
//---------------------
//
//---------------------
function NETLinkAjax()
{
//Eigenschaften deklarieren und initialisieren
this.url = "";
this.params = "";
this.response = "";
this.method = "POST";
this.onSuccess = null;
this.onError = function (msg) {
// alert(msg);
};
this.xmlHttpRequest;
this.more = "false";
this.more = "false";
this.cbResponse = null;
this.cbState = null;
//XMLHttpRequest-Objekt erstellen
this.xmlHttpRequest = getXMLHttpRequest();
if (!this.xmlHttpRequest) {
this.onError("Es konnte kein XMLHttpRequest-Objekt erstellt werden.");
return false;
}
}
NETLinkAjax.prototype.doRequest = function (bAsyncron)
{
var antwortText;
if (!this.url) {
this.onError("Es wurde kein URL angegeben. Der Request wird abgebrochen.");
return false;
}
if (!this.method) {
this.method = "GET";
} else {
this.method = this.method.toUpperCase();
}
var _this = this;
switch (this.method) {
case "GET":
this.xmlHttpRequest.open(this.method, this.url + "?" + this.params, bAsyncron/*asyncron*/);
this.xmlHttpRequest.onreadystatechange = readyStateHandler;
this.xmlHttpRequest.send(null);
break;
case "POST":
this.xmlHttpRequest.open(this.method, this.url, bAsyncron /*asyncron*/);
this.xmlHttpRequest.onreadystatechange = readyStateHandler;
try{
this.xmlHttpRequest.send(this.params);
}
catch(e)
{
// catches "NS_ERROR_NOT_INITIALIZED", if there is no response from NETLink
NETLinkCallBackHandler(createStateResponse(NETLINK_NOT_AVAILABLE), "", null);
}
break;
}
if (bAsyncron == false) {
_this.response = this.xmlHttpRequest.responseText;
}
function readyStateHandler()
{ /* wird im "asyncron-Modus" aufgerufen!*/
try{
if (_this.xmlHttpRequest.readyState < 4 ||
_this.xmlHttpRequest.status == 403 || //3.07.10 eh: 'forbidden' (proxy)
_this.xmlHttpRequest.status == 502) //3.07.10 eh: 'bad gateway' (proxy)
{
return false;
}
if (_this.xmlHttpRequest.status == 200 ||
_this.xmlHttpRequest.status == 305 || //
_this.xmlHttpRequest.status == 4) //4.02.10
{
NETLinkCallBackHandler(_this.xmlHttpRequest.responseText, _this.xmlHttpRequest.responseXML, _this);
}
else
{
if (_this.onError && (_this.xmlHttpRequest.status != 0)) {
_this.onError("[" + _this.xmlHttpRequest.status + " " + _this.xmlHttpRequest.statusText + "] There occured an error during data transfer.");
stopCyclicRead();
}
}
}
catch(e)
{
// debugger;
try{
NETLinkCallBackHandler(createStateResponse(NETLINK_NOT_AVAILABLE), "", null);
}
catch(e)
{
alert("readyStateHandler() 2. Stufe: catch e = " + e);
}
// alert("readyStateHandler(): catch e = " + e);
}
}
}; // END prototype doRequest()
//---------------------------------------
// NETLink Ajax Communication
//---------------------------------------
function askNETLink(request_data, bAsyncron)
{
var NETLinkAnswer;
var ajax_url = "/_NZZA_action_goNetlink";
var a = document.URL.split("/http");
/*
if (a.length > 1) {
ajax_url += "/http" + a[1];
} else {
ajax_url += a;
}
*/
if (g_ajax == null)
{
g_ajax = new NETLinkAjax(); // create the ajax communication object
}
g_ajax.url = ajax_url;
g_ajax.method = "POST";
g_ajax.params = request_data;
g_ajax.onError = AjaxShowError;
g_ajax.doRequest(bAsyncron);
NETLinkAnswer = g_ajax.response;
return NETLinkAnswer;
} // END
//---------------------------------------
// NETLink Ajax Communication
//---------------------------------------
function setNetlinkErrorResponseFunction(cbErrorResponse)
{
if (g_ajax == null)
{
g_ajax = new NETLinkAjax(); // create the ajax communication object
}
g_ajax.cbResponse = cbErrorResponse + "(x,y)"; // complete the function name and store it
}
//---------------------------------------
// NETLink Ajax Communication
//---------------------------------------
function setNetlinkResponseFunction(cbResponse)
{
if (g_ajax == null)
{
g_ajax = new NETLinkAjax(); // create the ajax communication object
}
g_ajax.cbResponse = cbResponse; // set user defined response function
}
//---------------------------------------
// NETLink Ajax Communication
//---------------------------------------
function setNetlinkStateFunction(cbState)
{
if (g_ajax == null)
{
g_ajax = new NETLinkAjax(); // create the ajax communication object
}
g_ajax.cbState = cbState; // store user callback function
}
/*
*/
function asbHasError(msg)
{
//Hat msg einen Inhalt?
if (!msg) {
return false;
}
//Befindet sich Zeichenkette AOEERROR: am Anfang von msg?
if (msg.indexOf("ASBERROR:") == 0) {
return true;
} else {
return false;
}
}
//allgemeine Fehlerbehandlung
function AjaxShowError(msg) {
alert(msg);
}
//Aufbereiten der Fehlermeldung eines PHP-Skripts
function asbGetError(msg) {
//AOEERROR: aus Fehlermeldung entfernen
return msg.replace(/ASBERROR:/, "");
}
//allgemeine Fehlerbehandlung
function asbLoadEntries() {
// alert(msg); // dummy as long as we get data in syncronous mode!!!
}
var Try = {these:function ()
{
var returnValue;
for (var i = 0; i < arguments.length; i++) {
var lambda = arguments[i];
try {
returnValue = lambda();
break;
}
catch (e) {
}
}
return returnValue;
}
}
/**
*/
function NETLinkCallBackHandler(responseTXT, responseXML, ajax_object)
{
var NETLinkElement;
var action;
var state_no;
var state_text;
//
// call user defined response function if it exists
//
if (ajax_object != null &&
ajax_object.cbResponse != null)
{
ajax_object.cbResponse(responseTXT); // call user callback function
bWaitForResponse = false; // transfer ready
return;
}
NETLinkElement = getElement(responseTXT, "NETLink");
action = getAttribute(NETLinkElement, "action");
switch(action)
{
case "error_response":
//
checkResponse("NETLinkCallBackHandler()", responseTXT);
//
break;
case "get_config_response":
//
// is syncron processed
//
break;
case "put_config_response":
//
// successful transferred to NETLink
//
break;
case "read_response":
xmlVariables = responseTXT;
showS7Variables(xmlVariables);
break;
case "wlan_config_response":
xmlVariables = responseTXT;
showWlanConfig(xmlVariables);
break;
case "diagnostic_response":
xmlVariables = responseTXT;
showDiagnosticInformation(xmlVariables);
break;
case "lifelist_response":
xmlVariables = responseTXT;
showLifelistResponse(xmlVariables);
break;
case "state_response":
// get the state info from the response xml stream
NETLinkElement = getElement(responseTXT, "response");
state_no = getAttribute(NETLinkElement, "state_no");
state_text = getStateText(parseInt(state_no, 10));
if (ajax_object != null &&
ajax_object.cbState != null)
{
ajax_object.cbState(state_text); // call user callback function
}
break;
default:;
if (ajax_object != null &&
ajax_object.cbState != null)
{
ajax_object.cbState("not_available"); // call user callback function
}
}
bWaitForResponse = false; // transfer ready
}
/**
*/
function getStateText(state_no)
{
var state_text;
switch(state_no)
{
case NETLINK_NOT_AVAILABLE:
state_text = "not_available";
break;
case NETLINK_READY:
state_text = "ready";
break;
case SAVE_WLAN_PARAMETER_OK:
state_text = "save_ok";
break;
case SAVE_WLAN_PARAMETER_FAILED:
state_text = "save_failed";
break;
default:;
state_text = "not_available";
} // END switch
return state_text;
}
/**
*/
function getXMLHttpRequest()
{
if (window.XMLHttpRequest) {
//XMLHttpRequest Firefox, Opera, Safari, ...
isIE = false;
return new XMLHttpRequest();
}
else
{
if (window.ActiveXObject) {
try {
//XMLHTTP (neu) Internet Explorer
return new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
//XMLHTTP (alt) Internet Explorer
return new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {
return null;
}
}
}
}
return false;
}
/**
*/
function getElement(xmlBuffer, pElement)
{
var element;
var elementBegin;
var elementEnd;
element = "<" + pElement;
elementBegin = xmlBuffer.indexOf(element);
if (elementBegin == -1){ // check if valid element begin
return ""; // not found
}
element = "" + pElement;
elementEnd = xmlBuffer.indexOf(element);
if (elementEnd == -1){ // check if valid element begin
return ""; // not found
}
var retBuffer = xmlBuffer.substr(elementBegin, elementEnd + element.length - elementBegin);
return retBuffer + ">";
}
/**
*/
function getElementContent(xmlBuffer, pElement)
{
var element;
var elementBegin;
var elementEnd;
element = "<" + pElement;
elementBegin = xmlBuffer.indexOf(element);
if (elementBegin == -1){ // check if valid element begin
return ""; // not found
}
elementBegin = xmlBuffer.indexOf(">", elementBegin); // search end of element name
element = "" + pElement;
elementEnd = xmlBuffer.indexOf(element);
if (elementEnd == -1){ // check if valid element begin
return ""; // not found
}
var retBuffer = xmlBuffer.substr(elementBegin + 1, elementEnd - elementBegin -1);
return retBuffer;
}
/**
*/
function getChildElements(xmlBuffer, pElement)
{
var element;
var elementBegin;
var elementEnd;
var spaceDelimiter;
var tabDelimiter;
var nlDelimiter;
var tagDelimiter;
var currElementName;
var arElements = new Array();
var cnt = 0;
var buffer_len = xmlBuffer.lenght;
if (pElement == "*")
{
element_b = "<"
}
else
{
element_b = "<" + pElement;
element_e = "" + pElement;
}
elementBegin = xmlBuffer.indexOf(element_b, 1);
while(elementBegin != -1)
{
if (pElement == "*")
{ //complete current element name
spaceDelimiter = xmlBuffer.indexOf(" ", elementBegin);
if (spaceDelimiter == -1)
spaceDelimiter = buffer_len;
tabDelimiter = xmlBuffer.indexOf("\t", elementBegin);
if (tabDelimiter == -1)
tabDelimiter = buffer_len;
nlDelimiter = xmlBuffer.indexOf("\r", elementBegin);
if (nlDelimiter == -1)
{
nlDelimiter = xmlBuffer.indexOf("\n", elementBegin);
if (nlDelimiter == -1)
{
nlDelimiter = buffer_len;
}
}
tagDelimiter = xmlBuffer.indexOf(">", elementBegin);
if (tagDelimiter == -1)
tagDelimiter = buffer_len;
if (spaceDelimiter < tabDelimiter)
elementEnd = spaceDelimiter;
else
elementEnd = tabDelimiter;
if (elementEnd > nlDelimiter)
elementEnd = nlDelimiter;
if (elementEnd > tagDelimiter)
elementEnd = tagDelimiter;
var currElementName = xmlBuffer.substr(elementBegin+1, elementEnd - elementBegin -1);
element_b = "<" + currElementName;
element_e = "" + currElementName;
if (currElementName.length == 0) {
// no more elements
return arElements; // array of elements
}
}
elementEnd = xmlBuffer.indexOf(element_e, elementBegin);
if (elementEnd != -1) // check if valid element end
{
arElements[cnt++] = xmlBuffer.substr(elementBegin, elementEnd + element_e.length - elementBegin) + ">";
}
else
break;
if (pElement == "*")
{
element_b = "<";
elementEnd++;
}
elementBegin = xmlBuffer.indexOf(element_b, elementEnd);
}
return arElements; // array of elements
} // getChildElements()
/**
*/
function getAttribute( pElement, pAttribut)
{
var offset;
var pAttr;
var pQuoteBegin;
var pQuoteEnd;
var retBuffer;
if (pElement.length == 0)
return ""; // not found
offset = 0;
pAttr = pElement;
do
{ // search for the requested attribut name
pAttr = pAttr.substr(offset);
offset = pAttr.indexOf(pAttribut);
// alert("pAttr: " + pAttr + " offset:" + offset);
if (offset < 0){
return ""; // not found
}
if (pAttr[offset-1] > ' ')
{ // char before attribute is no word delimiter
offset += pAttribut.length; // point to end of attribut name
continue; // go to next attribute
}
offset += pAttribut.length; // point to end of attribut name
// alert("pAttr.charAt(offset) :" + pAttr.charAt(offset) + " pAttr.charAt(offset+1) :" + pAttr.charAt(offset+1) + " pAttr.charAt(offset+2) :" + pAttr.charAt(offset+2));
}
while((pAttr.charAt(offset) != '=') && // word delimiter for attribut found?
(pAttr.charAt(offset) != ' '));
pQuoteBegin = pAttr.indexOf('=',offset);
if (pQuoteBegin < 0){ // check equal sign of attribute
return ""; // not found
}
pQuoteBegin = pAttr.indexOf('"',pQuoteBegin);
if (pQuoteBegin < 0){ // check first quote of attribute
return ""; // not found
}
pQuoteBegin++; // value right after quote
pQuoteEnd = pAttr.indexOf( '"', pQuoteBegin);
if (pQuoteEnd < 0 ) { // check end quote of attribute
return ""; // not found
}
retBuffer = pAttr.substr(pQuoteBegin, pQuoteEnd - pQuoteBegin);
return retBuffer;
}
function createStateResponse(state_no)
{
var response;
//debugger;
response = "\n" +
"\n" +
"\n" +
"\n" +
"";
return response;
}
/**
*/
function getNodeName(Node)
{
var elementBegin;
var elementEnd;
var endTag;
var NodeName = "";
elementBegin = Node.indexOf("<", 0);
endTag = Node.indexOf(">", elementBegin);
elementEnd = Node.search(/\s/); // search next white space
if (elementEnd == -1 ||
elementEnd > endTag)
{
elementEnd = endTag;
}
NodeName = Node.substr(elementBegin+1, elementEnd - elementBegin -1);
return NodeName;
}
function doWait()
{
var x = document.getElementById("button_save_id");
x.style.cursor = "wait";
}
function doNoWait()
{
// var x = document.getElementsByTagName( "body" )[0]; x.style.cursor = "auto";
var x = document.getElementById("button_save_id");
x.style.cursor = "auto";
}
function setTraceEntry(entry)
{
traceBuffer[trace_index++] = entry;
trace_index = trace_index % MAX_ENTRIES;
}
/***************************************************
functions from other authors
**************************************************/
// xp_progressbar
// Copyright 2004 Brian Gosselin of ScriptAsylum.com
//
// v1.0 - Initial release
// v1.1 - Added ability to pause the scrolling action (requires you to assign
// the bar to a unique arbitrary variable).
// - Added ability to specify an action to perform after a x amount of
// - bar scrolls. This requires two added arguments.
// v1.2 - Added ability to hide/show each bar (requires you to assign the bar
// to a unique arbitrary variable).
// example calls:
// var bar1= createBar(300,15,'white',1,'black','blue',85,7,3,"");
// var bar2= createBar(320,15,'white',1,'black','green',85,7,3,"alert('Hi there')");
// var xyz = createBar(
// total_width,
// total_height,
// background_color,
// border_width,
// border_color,
// block_color,
// scroll_speed,
// block_count,
// scroll_count,
// action_to_perform_after_scrolled_n_times
// )
var w3c=(document.getElementById)?true:false;
var ie=(document.all)?true:false;
var N=-1;
function createBar(w,h,bgc,brdW,brdC,blkC,speed,blocks,count,action)
{
if(ie||w3c){
var t='
';
t+='';
for(i=0;i';
}
t+='
';
document.write(t);
var bA=(ie)?document.all['blocks'+N]:document.getElementById('blocks'+N);
bA.bar=(ie)?document.all['_xpbar'+N]:document.getElementById('_xpbar'+N);
bA.blocks=blocks;
bA.N=N;
bA.w=w;
bA.h=h;
bA.speed=speed;
bA.ctr=0;
bA.count=count;
bA.action=action;
bA.showBar=function(){
this.bar.style.visibility="visible";
}
bA.hideBar=function(){
this.bar.style.visibility="hidden";
}
bA.tid=setInterval('startBar('+N+')',speed);
return bA;
}}
function startBar(bn){
var t=(ie)?document.all['blocks'+bn]:document.getElementById('blocks'+bn);
if(parseInt(t.style.left)+t.h+1-(t.blocks*t.h+t.blocks)>t.w){
t.style.left=-(t.h*2+1)+'px';
t.ctr++;
if(t.ctr>=t.count){
eval(t.action);
t.ctr=0;
}}else t.style.left=(parseInt(t.style.left)+t.h+1)+'px';
}
/*
Basic idea from:
Author: Matt Kruse
WWW: http://www.mattkruse.com/
*/
// Fill the window with contents
function PopupWindow_populate(contents)
{
this.contents = contents;
this.populated = false;
}
// Refresh the displayed contents of the popup
function PopupWindow_refresh()
{
document.getElementById(this.divName).innerHTML = this.contents;
}
// Position and show the popup, relative to an anchor object
function showPopup()
{
if (!this.visible &&
( this.contents != ""))
{
this.refresh();
this.x = this.mouseX;
this.y = this.mouseY;
this.x += this.offsetX;
this.y += this.offsetY;
// Show the DIV object
document.getElementById(this.divName).style.left = this.x + "px";
document.getElementById(this.divName).style.top = this.y + "px";
document.getElementById(this.divName).style.visibility = "visible";
this.visible = true;
}
}
function PopupWindow_Move(ev)
{
var mouseposX;
var mouseposY;
if (ev)
{
mouseposX = ev.pageX ? ev.pageX : ev.clientX;
mouseposY = ev.pageY ? ev.pageY : ev.clientY;
}
else
{
ev = window.event;
/* coordinaten in Bezug auf ein Element
mouseposX = window.event.offsetX;
mouseposY = window.event.offsetY;
*/
mouseposX = ev.clientX + document.body.scrollLeft - document.body.clientLeft;
mouseposY = ev.clientY + document.body.scrollTop - document.body.clientTop;
}
g_PopupWindow.mouseX = mouseposX;
g_PopupWindow.mouseY = mouseposY;
}
// Hide the popup
function hidePopup()
{
document.getElementById(g_PopupWindow.divName).style.visibility = "hidden";
g_PopupWindow.visible = false;
}
// CONSTRUCTOR for the PopupWindow object
// Pass it a DIV name to use a DHTML popup.
function PopupWindow(divName)
{
this.divName = divName;
this.popupWindow = null;
this.visible = false;
this.contents = "";
this.divName = divName;
this.offsetX = 0;
this.offsetY = 0;
this.mouseX = 0;
this.mouseY = 0;
// Method mappings
this.populate = PopupWindow_populate;
this.refresh = PopupWindow_refresh;
this.showPopup = showPopup;
// this.hidePopup = hidePopup;
this.docMove = PopupWindow_Move;
if (document.addEventListener)
{
document.addEventListener("mousemove", this.docMove, true);
}
else
{ // IE
document.body.onmousemove = PopupWindow_Move;
}
}
/*
** Translation Table as described in RFC1113
*/
var cb64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/*
** Translation Table to decode
*/
var cd64="|$$$}rstuvwxyz{$$$$$$$>?@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
/*
** encodeblock
**
** encode 3 8-bit binary bytes as 4 '6-bit' characters
*/
function encodeblock( inp, outp, len )
{
var index;
var cb64_value;
index = inp[0] >> 2;
outp[0] = cb64.charAt( index );
index = ((inp[0] & 0x03) << 4) | ((inp[1] & 0xf0) >> 4);
outp[1] = cb64.charAt( index );
index = ((inp[1] & 0x0f) << 2) | ((inp[2] & 0xc0) >> 6);
outp[2] = (len > 1 ? cb64.charAt( index ) : ':');
index = inp[2] & 0x3f ;
outp[3] = (len > 2 ? cb64.charAt( index ) : ':');
}
/*
** encode
**
** base64 encode a stream adding padding and line breaks as per spec.
*/
function encode_b64( arInp)
{
var inp = new Array(3);
var outp = new Array(4);
var i, len = 0;
var ix_inp = 0;
var ix_outp = 0;
var ar_len = arInp.length;
var sOutp
sOutp = "";
while( ar_len > ix_inp )
{
len = 0;
for( i = 0; i < 3; i++ ) {
if( ar_len > ix_inp )
{
inp[i] = arInp.charCodeAt(ix_inp);
len++;
}
else {
inp[i] = 0;
}
ix_inp++;
}
if( len )
{
encodeblock( inp, outp, len );
for( i = 0; i < 4; i++ ) {
if (outp[i].charCodeAt(0) > 0)
sOutp += outp[i];
else
sOutp += ":";
}
}
}
return sOutp;
}
/*
** decodeblock
**
** decode 4 '6-bit' characters into 3 8-bit binary bytes
*/
function decodeblock( inp, outp )
{
outp[ 0 ] = (inp[0] << 2 | inp[1] >> 4) & 0xFF;
outp[ 1 ] = (inp[1] << 4 | inp[2] >> 2) & 0xFF;
outp[ 2 ] = (((inp[2] << 6) & 0xc0) | inp[3]) & 0xFF;
}
/*
** decode
**
** decode a base64 encoded stream discarding padding, line breaks and noise
*/
function decode_b64( arInp)
{
var inp = new Array(4);
var outp = new Array(3);
var v;
var i;
var len;
var ix_inp = 0;
var ix_outp = 0;
var ar_len = arInp.length;
var sOutp;
sOutp = "";
while( ar_len > ix_inp )
{
for( len = 0, i = 0; i < 4 && ( ar_len > ix_inp ); i++ )
{
v = 0;
while( ( ar_len > ix_inp ) && v == 0 )
{
v = arInp.charCodeAt(ix_inp++);
v = ((v < 43 || v > 122) ? 0 : cd64.charCodeAt( v - 43 ));
if( v )
{
v = ((v == 36 /*'$'*/) ? 0 : v - 61);
}
}
inp[i] = 0;
if ( ar_len >= ix_inp )
{
len++;
if( v )
{
inp[ i ] = (v - 1);
}
}
}
if( len )
{
decodeblock( inp, outp );
for( i = 0; i < len - 1; i++ )
{
if (outp[i] != 0)
sOutp += String.fromCharCode(outp[i]);
}
}
}
return sOutp;
}